import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 口算习题展示窗体
 * 功能：
 * 1. 读取CSV文件中的习题数据
 * 2. 显示当前题目
 * 3. 上一题/下一题按钮切换题目
 * 4. 边界状态处理
 */
public class ExerciseFrame extends JFrame {
    // 存储习题数据：每个元素是数组[算式, 答案]
    private List<String[]> exerciseList;
    // 当前显示的题目索引
    private int currentIndex;

    // 界面组件
    private JLabel expressionLabel;  // 显示算式
    private JLabel answerLabel;      // 显示答案
    private JButton prevButton;      // 上一题按钮
    private JButton nextButton;      // 下一题按钮

    // CSV文件路径（与生成器保持一致）
    private static final String CSV_PATH = "math_exercises.csv";

    /**
     * 构造方法：初始化窗体和组件
     */
    public ExerciseFrame() {
        // 1. 初始化习题数据
        exerciseList = loadExercisesFromCSV();
        if (exerciseList.isEmpty()) {
            JOptionPane.showMessageDialog(this, "未读取到习题数据！", "错误", JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
        currentIndex = 0; // 默认显示第一题

        // 2. 窗体基础设置
        setTitle("100以内加减法口算习题");
        setSize(400, 200); // 窗体大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗体退出程序
        setLocationRelativeTo(null); // 居中显示
        setLayout(new BorderLayout(10, 10)); // 边框布局，组件间距10

        // 3. 初始化界面组件
        initComponents();

        // 4. 更新界面显示（初始显示第一题）
        updateExerciseDisplay();
        updateButtonStates();
    }

    /**
     * 初始化界面组件
     */
    private void initComponents() {
        // 顶部面板：显示题目信息
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new GridLayout(2, 1, 5, 5)); // 2行1列网格布局

        // 算式标签
        expressionLabel = new JLabel();
        expressionLabel.setFont(new Font("宋体", Font.PLAIN, 24)); // 字体大小24
        expressionLabel.setHorizontalAlignment(SwingConstants.CENTER); // 居中对齐
        topPanel.add(expressionLabel);

        // 答案标签
        answerLabel = new JLabel();
        answerLabel.setFont(new Font("宋体", Font.PLAIN, 20));
        answerLabel.setHorizontalAlignment(SwingConstants.CENTER);
        topPanel.add(answerLabel);

        // 底部面板：放置按钮
        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 10)); // 流式布局，按钮间距20

        // 上一题按钮
        prevButton = new JButton("上一题");
        prevButton.setFont(new Font("宋体", Font.PLAIN, 16));
        prevButton.addActionListener(e -> onPrevButtonClick()); // 绑定点击事件
        bottomPanel.add(prevButton);

        // 下一题按钮
        nextButton = new JButton("下一题");
        nextButton.setFont(new Font("宋体", Font.PLAIN, 16));
        nextButton.addActionListener(e -> onNextButtonClick()); // 绑定点击事件
        bottomPanel.add(nextButton);

        // 将面板添加到窗体
        add(topPanel, BorderLayout.CENTER); // 顶部面板居中
        add(bottomPanel, BorderLayout.SOUTH); // 底部面板居下
    }

    /**
     * 从CSV文件加载习题数据
     * @return 习题列表（空列表表示加载失败）
     */
    private List<String[]> loadExercisesFromCSV() {
        List<String[]> list = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(CSV_PATH))) {
            String line;
            boolean isFirstLine = true; // 跳过表头行
            while ((line = reader.readLine()) != null) {
                if (isFirstLine) {
                    isFirstLine = false;
                    continue;
                }
                // 分割行数据（按逗号分割，注意算式中无逗号）
                String[] parts = line.split(",");
                if (parts.length == 2) {
                    list.add(parts); // 存储[算式, 答案]
                }
            }
        } catch (IOException e) {
            System.err.println("读取CSV文件失败：" + e.getMessage());
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 更新当前显示的题目信息
     */
    private void updateExerciseDisplay() {
        String[] currentExercise = exerciseList.get(currentIndex);
        String expression = currentExercise[0];
        String answer = currentExercise[1];
        // 设置标签文本
        expressionLabel.setText("题目：" + expression);
        answerLabel.setText("答案：" + answer);
        // 更新窗体标题（显示当前题号）
        setTitle("100以内加减法口算习题 - 第" + (currentIndex + 1) + "题/共" + exerciseList.size() + "题");
    }

    /**
     * 更新按钮状态（边界处理）
     */
    private void updateButtonStates() {
        // 第一题：上一题按钮禁用
        prevButton.setEnabled(currentIndex > 0);
        // 最后一题：下一题按钮禁用
        nextButton.setEnabled(currentIndex < exerciseList.size() - 1);
    }

    /**
     * 上一题按钮点击事件处理
     */
    private void onPrevButtonClick() {
        if (currentIndex > 0) {
            currentIndex--;
            updateExerciseDisplay();
            updateButtonStates();
        }
    }

    /**
     * 下一题按钮点击事件处理
     */
    private void onNextButtonClick() {
        if (currentIndex < exerciseList.size() - 1) {
            currentIndex++;
            updateExerciseDisplay();
            updateButtonStates();
        }
    }

    /**
     * 主方法：启动窗体
     */
    public static void main(String[] args) {
        // Swing组件需在事件调度线程中运行
        SwingUtilities.invokeLater(() -> {
            ExerciseFrame frame = new ExerciseFrame();
            frame.setVisible(true); // 显示窗体
        });
    }
}
